#!/bin/bash

# 网易云音乐API Docker部署脚本
# 使用方法: ./deploy.sh [start|stop|restart|logs|status|update]

set -e

# 配置变量
PROJECT_NAME="netease-music-api"
COMPOSE_FILE="docker-compose.yml"
COMPOSE_PROD_FILE="docker-compose.prod.yml"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $1"
}

# 检查Docker是否安装
check_docker() {
    if ! command -v docker &> /dev/null; then
        log_error "Docker未安装，请先安装Docker"
        exit 1
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose未安装，请先安装Docker Compose"
        exit 1
    fi
    
    log_info "Docker环境检查通过"
}

# 验证Docker Compose配置
validate_compose_config() {
    log_info "验证Docker Compose配置文件..."
    
    # 验证开发环境配置
    if ! docker-compose -f $COMPOSE_FILE config > /dev/null 2>&1; then
        log_error "docker-compose.yml 配置有误"
        docker-compose -f $COMPOSE_FILE config
        exit 1
    fi
    
    # 验证生产环境配置
    if [ -f "$COMPOSE_PROD_FILE" ]; then
        if ! docker-compose -f $COMPOSE_PROD_FILE config > /dev/null 2>&1; then
            log_error "docker-compose.prod.yml 配置有误"
            docker-compose -f $COMPOSE_PROD_FILE config
            exit 1
        fi
    fi
    
    log_info "配置文件验证通过"
}

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -tuln | grep -q ":$port "; then
        log_warn "端口 $port 已被占用"
        return 1
    fi
    return 0
}

# 启动服务
start_service() {
    log_info "启动网易云音乐API服务..."
    
    # 检查端口
    check_port 3000 || log_warn "端口3000可能被占用，请检查"
    
    # 验证配置
    validate_compose_config
    
    # 构建并启动容器
    docker-compose -f $COMPOSE_FILE up -d --build
    
    log_info "服务启动完成"
    log_info "API地址: http://localhost:3000"
    log_info "查看日志: ./deploy.sh logs"
}

# 启动生产环境服务
start_prod() {
    log_info "启动生产环境服务..."
    
    # 检查端口
    check_port 80 || log_warn "端口80可能被占用，请检查"
    check_port 443 || log_warn "端口443可能被占用，请检查"
    
    # 验证配置
    validate_compose_config
    
    # 构建并启动容器
    docker-compose -f $COMPOSE_PROD_FILE up -d --build
    
    log_info "生产环境服务启动完成"
    log_info "HTTP地址: http://localhost"
    log_info "HTTPS地址: https://localhost (需要SSL证书)"
    log_info "查看日志: ./deploy.sh logs"
}

# 停止服务
stop_service() {
    log_info "停止网易云音乐API服务..."
    
    if [ -f "$COMPOSE_PROD_FILE" ]; then
        docker-compose -f $COMPOSE_PROD_FILE down
    fi
    docker-compose -f $COMPOSE_FILE down
    
    log_info "服务已停止"
}

# 重启服务
restart_service() {
    log_info "重启网易云音乐API服务..."
    stop_service
    sleep 2
    start_service
}

# 查看日志
show_logs() {
    log_info "显示服务日志..."
    docker-compose -f $COMPOSE_FILE logs -f --tail=100
}

# 查看状态
show_status() {
    log_info "服务状态:"
    docker-compose -f $COMPOSE_FILE ps
    
    echo ""
    log_info "容器资源使用情况:"
    docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
}

# 更新服务
update_service() {
    log_info "更新网易云音乐API服务..."
    
    # 拉取最新代码（如果是git仓库）
    if [ -d ".git" ]; then
        log_info "拉取最新代码..."
        git pull origin main
    fi
    
    # 重新构建并启动
    docker-compose -f $COMPOSE_FILE down
    docker-compose -f $COMPOSE_FILE up -d --build
    
    log_info "服务更新完成"
}

# 清理资源
cleanup() {
    log_warn "清理Docker资源..."
    
    # 停止并删除容器
    docker-compose -f $COMPOSE_FILE down --rmi all --volumes --remove-orphans
    
    # 清理未使用的镜像
    docker image prune -f
    
    log_info "清理完成"
}

# 备份数据
backup_data() {
    local backup_dir="./backup/$(date +%Y%m%d_%H%M%S)"
    mkdir -p "$backup_dir"
    
    log_info "备份数据到 $backup_dir"
    
    # 备份data目录
    if [ -d "data" ]; then
        cp -r data "$backup_dir/"
        log_info "data目录已备份"
    fi
    
    # 备份配置文件
    cp docker-compose*.yml "$backup_dir/" 2>/dev/null || true
    cp nginx.conf "$backup_dir/" 2>/dev/null || true
    
    log_info "备份完成: $backup_dir"
}

# 显示帮助信息
show_help() {
    echo "网易云音乐API Docker部署脚本"
    echo ""
    echo "使用方法: $0 [命令]"
    echo ""
    echo "命令:"
    echo "  start     启动开发环境服务"
    echo "  start-prod 启动生产环境服务（包含Nginx）"
    echo "  stop      停止所有服务"
    echo "  restart   重启服务"
    echo "  logs      查看服务日志"
    echo "  status    查看服务状态"
    echo "  update    更新服务"
    echo "  cleanup   清理Docker资源"
    echo "  backup    备份数据"
    echo "  validate  验证配置文件"
    echo "  help      显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 start      # 启动开发环境"
    echo "  $0 start-prod # 启动生产环境"
    echo "  $0 logs       # 查看日志"
}

# 主函数
main() {
    case "${1:-help}" in
        start)
            check_docker
            start_service
            ;;
        start-prod)
            check_docker
            start_prod
            ;;
        stop)
            stop_service
            ;;
        restart)
            restart_service
            ;;
        logs)
            show_logs
            ;;
        status)
            show_status
            ;;
        update)
            update_service
            ;;
        cleanup)
            cleanup
            ;;
        backup)
            backup_data
            ;;
        validate)
            check_docker
            validate_compose_config
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@" 